//
//  UserAccountViewModel.swift
//  WeiBo09
//
//  Created by 裘明 on 15/9/9.
//  Copyright © 2015年 qm. All rights reserved.
//

import UIKit
import ReactiveCocoa

/// 用户视图模型
class UserAccountViewModel: NSObject {
    
    /// 单例
    static let sharedUserAccount = UserAccountViewModel()
    
    /// 类似于OC中的set方式给，视图模型中的用户模型赋值
    ///
    /// - returns: 用户帐户信息
    override init() {
        userAccount = UserAccount.loadUserAccount()
    }
    /// 用户帐户
    var userAccount: UserAccount?
    
    /// 用户登录标记（使用归档，保存口令）
    var userLogin: Bool {
        return accessToken != nil
    }
    /// 用户口令
    var accessToken: String? {
        return userAccount?.access_token
    }
    /// 用户头像
    var avatar_large: NSURL? {
        return NSURL(string: userAccount?.avatar_large ?? "")
    }
    
    
    ///   加载用户帐户信息
    ///
    /// - parameter code: 请求码
    ///
    /// - returns:        RAC Signal
    func loadUserAccount(code: String) -> RACSignal {
        
        return RACSignal.createSignal { (subscriber) -> RACDisposable! in
            
            // doNext是将信号1的结果直接传递给信息2使用，后面记得加上subscribeError\subscribeNext等，否则doNext不执行
            NetWorkTools.shareNetwork.loadAccessToken(code).doNext({ (
                result) -> Void in
                
                /// 创建用户模型
                let account = UserAccount(dict: result as! [String: AnyObject])
                
                //  给视图模型中的userAccount属性赋值
                 self.userAccount = account
                
                NetWorkTools.shareNetwork.loadUseInfo(account.uid!).subscribeNext({ (result) -> Void in
                    
                    let dict = result as! [String: AnyObject]
                    /// 设置帐号属性
                    account.name = dict["name"] as? String
                    account.avatar_large = dict["avatar_large"] as? String
                    
                    /// 保存帐号
                    account.saveUserAccount()
                    subscriber.sendCompleted()
                    
                    }) { (error) -> Void in
                        
                    subscriber.sendError(error)
                }
                
            }).subscribeError({ (error) -> Void in
                
                   subscriber.sendError(error)
            })
            return nil
        }
        
    }
    
}
